﻿using System;
using System.Runtime.InteropServices;

namespace ZHello.Utils
{
    /// <summary>
    /// 播放声音单元
    /// </summary>
    public static class PlaySoundUtility
    {
        /// <summary>
        /// 播放标识
        /// </summary>
        [Flags]
        private enum PlaySoundFlags : int
        {
            /// <summary>
            /// 同步播放
            /// </summary>
            SND_SYNC = 0x0000,    /* play synchronously (default) */ //同步

            /// <summary>
            /// 异步播放
            /// </summary>
            SND_ASYNC = 0x0001,    /* play asynchronously */ //异步

            SND_NODEFAULT = 0x0002,    /* silence (!default) if sound not found */
            SND_MEMORY = 0x0004,    /* pszSound points to a memory file */
            SND_LOOP = 0x0008,    /* loop the sound until next sndPlaySound */
            SND_NOSTOP = 0x0010,    /* don't stop any currently playing sound */
            SND_NOWAIT = 0x00002000, /* don't wait if the driver is busy */
            SND_ALIAS = 0x00010000, /* name is a registry alias */
            SND_ALIAS_ID = 0x00110000, /* alias is a predefined ID */
            SND_FILENAME = 0x00020000, /* name is file name */
            SND_RESOURCE = 0x00040004    /* name is resource name or atom */
        }

        /// <summary>
        /// 播放WAV文件
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static bool PlaySound(string fileName)
        {
            if (System.IO.File.Exists(fileName) && System.IO.Path.GetExtension(fileName).ToLower().Equals(".wav"))
            {
                return PlaySound(fileName, IntPtr.Zero, PlaySoundFlags.SND_ASYNC);
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// 播放WAV文件
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static bool PlayWavSound(string fileName)
        {
            if (System.IO.File.Exists(fileName) && System.IO.Path.GetExtension(fileName).ToLower().Equals(".wav"))
            {
                try
                {
                    System.Media.SoundPlayer sndPlayer = new System.Media.SoundPlayer(fileName);
                    sndPlayer.Play();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// 播放声音WAV文件
        /// </summary>
        /// <param name="szSound"></param>
        /// <param name="hMod"></param>
        /// <param name="flags"></param>
        /// <returns></returns>
        [DllImport("winmm.dll")]
        private static extern bool PlaySound(string szSound, IntPtr hMod, PlaySoundFlags flags);
    }
}